/*
 *	@file	d_num_input.c
 *	@brief	数値入力デバッグソース　フィールド非常駐オーバーレイソース
 *	@author	Miyuki Iwasawa
 *	@date	09.05.07
 *
 *
 *	2009.05.09  tamada  savework表示機能を追加
 */

#ifdef PM_DEBUG


#include "common.h"
#include "system/bmp_list.h"
#include "system/bmp_menu.h"
#include "fld_bmp.h"
#include "system/fontproc.h"
#include "fieldmap.h"
#include "fieldsys.h"
#include "system/debug_flag.h"
#include "debug_saito.h"
#include "d_nagi.h"
#include "d_hosaka.h"
#include "d_tomoya.h"
#include "d_taya.h"

#include "ev_mapchange.h"
#include "fld_debug.h"
#include "zonedata.h"
#include "div_map.h"
#include <ctype.h>
#include "system/builddate.h"
#include "system/window.h"

#include "mapdefine.h"

#include "system/snd_tool.h"
#include "field/field.h"
#include "poketool/poke_tool.h"
#include "poketool/status_rcv.h"
#include "poketool/pokeparty.h"
#include "itemtool/myitem.h"
#include "itemtool/itemsym.h"

#include "tv_topic.h"
#include "system/pm_rtc.h"
#include "gflib/strbuf.h"
#include "gflib/strbuf_family.h"
#include "field/field_matrix.h"
#include "battle/battle_common.h"
#include "savedata/savedata.h"
#include "savedata/tv_work.h"
#include "savedata/record.h"
#include "savedata/b_tower.h"
#include "savedata/pokepark_data.h"
#include "savedata/gametime.h"
#include "savedata/system_data.h"
#include "savedata/randomgroup.h"	//RANDOM_GROUP
#include "savedata/contest_savedata.h"
#include "savedata/bonguri.h"
#include "savedata/frontier_savedata.h"
#include "savedata/pkthln_svdata.h"
#include "savedata/safari_sv.h"
#include "situation_local.h"
#include "field/evwkdef.h"
#include "sysflag.h"
#include "field/eventflag.h"    //EventWork_GetEventWorkAdrs etc.
#include "field/union_beacon_tool.h"
#include "syswork.h"
#include "communication/communication.h"
#include "comm_union_beacon.h"
#include "report.h"
#include "fielddata/script/saveflag.h"
#include "fielddata/script/savework.h"
#include "script.h"

#include "fieldmap_work.h"			//FIELDMAP_WORK
#include "fieldmap_func.h"			//FLDMAPFUNC_〜
#include "fld_pmtel.h"

#include "system/debug_flag.h"
#include "fld_debug_local.h"
#include "d_num_input.h"
#include "application/app_tool.h"
#include "msgdata/msg.naix"
#include "msgdata/msg_debug_numinput.h"
#include "../fielddata/script/scr_seq.naix"   //NARC_scr_seq_debug_savework_name_bin etc.

//●デバッグ項目ウインドウデータ
#define	DNI_LIST_PX1		(0)		//Ｘ座標1
#define	DNI_LIST_PY1		(1+4)		//Ｙ座標1
#define	DNI_LIST_SX		(16+13)	//Ｘサイズ
#define	DNI_LIST_SY		(18)	//Ｙサイズ
#define	DNI_LIST_PL		(FLD_SYSFONT_PAL)	//パレットナンバー
#define	DNI_LIST_CH		(8)


///汎用数値入力インターフェースリスト定義
typedef void (*DEBUG_NUMINPUT_FUNC_S)(SAVEDATA* sv,u32 param,u32 value);
typedef u32 (*DEBUG_NUMGET_FUNC_S)(SAVEDATA* sv,u32 param);
typedef void (*DEBUG_NUMINPUT_FUNC_F)(FIELDSYS_WORK* fsys,u32 param,u32 value);
typedef u32 (*DEBUG_NUMGET_FUNC_F)(FIELDSYS_WORK* fsys,u32 param);

enum{
 D_NINPUT_F_SAVE,
 D_NINPUT_F_FSYS,
};
///項目選択用データの定義
typedef enum {
  D_NINPUT_DATA_CONST,    ///<固定データ
  D_NINPUT_DATA_ALLOC,    ///<自動生成データ
}D_NINPUT_DATA_TYPE;

typedef struct{
	u32	func_type;
	u32	min;
	u32	max;
	u32	param;
	void* set_func;
	void* get_func;
}DEBUG_NUMINPUT_LIST;

typedef struct{
	FIELDSYS_WORK* fsys;
	FLD_DEB_DAT * pFdd;	//フィールドメニューワーク
	GF_BGL_BMPWIN win;	//BMPウィンドウ
	const DEBUG_NUMINPUT_LIST*	pList;
	//const GMM_MENU_PARAM*		pMenu;
	int			list_num;

  D_NINPUT_DATA_TYPE data_type;
	int*		p_end_f;
	u32			now;
	u8			seq;
	u8			sel;
	u8			n_keta;
	u32			n_max;
	u32			n_min;
	u32			value;
	STRBUF*		nbuf[10];
}DEBUG_NUMINPUT_WORK;

///初期化パラメータ定義
typedef struct{
  D_NINPUT_DATA_TYPE data_type;       ///<データの種別
  u32   file_id;                      ///<D_NINPUT_DATA_ALLOCの場合の参照ファイルID

  /** D_NINPUT_DATA_CONSTの場合：各項目の数値入力時処理指定データ
   *  D_NINPUT_DATA_ALLOCの場合：生成時に使用するデフォルトデータ
   */
  const DEBUG_NUMINPUT_LIST * pList;
  const GMM_MENU_PARAM * pMenu;       ///<項目リスト表示用データ
  const u32 list_count;               ///<リストの大きさ
}DEBUG_NUMINPUT_INITIALIZER;

static void DebugNumInputControlTask(TCB_PTR tcb,void* work);
static void DebugNumInputListStart(FIELDSYS_WORK * fsys,int* end_f,
	const DEBUG_NUMINPUT_INITIALIZER * init);
static void	ninput_call_back(BMPLIST_WORK* lw,u32 param,u8 y);

static u32 getNameFileCount(u32 file_id);
static const DEBUG_NUMINPUT_LIST * makeNumInputList(u32 file_id, const DEBUG_NUMINPUT_LIST * proto);
static BMP_MENULIST_DATA * makeMenuList(FIELDSYS_WORK * fsys, u32 file_id);

static u32 DNumInput_RecordGet(SAVEDATA* sv,u32 param);
static void DNumInput_RecordSet(SAVEDATA* sv,u32 param,u32 value);
static u32 DNumInput_FrRecordGet(SAVEDATA* sv,u32 param);
static void DNumInput_FrRecordSet(SAVEDATA* sv,u32 param,u32 value);
static u32 DNumInput_TowerStageGet(SAVEDATA* sv,u32 param);
static void DNumInput_TowerStageSet(SAVEDATA* sv,u32 param,u32 value);
static u32 DNumInput_TowerChallengeGet(SAVEDATA* sv,u32 param);
static void DNumInput_TowerChallengeSet(SAVEDATA* sv,u32 param,u32 value);
static u32 DNumInput_TowerWifiRankGet(SAVEDATA* sv,u32 param);
static void DNumInput_TowerWifiRankSet(SAVEDATA* sv,u32 param,u32 value);
static u32 DNumInput_BonguriGet(SAVEDATA* sv,u32 param);
static void DNumInput_BonguriSet(SAVEDATA* sv,u32 param,u32 value);
static u32 DNumInput_PlayTimeGet(SAVEDATA* sv,u32 param);
static void DNumInput_PlayTimeSet(SAVEDATA* sv,u32 param,u32 value);
static u32 DNumInput_SafariObjLevelGet(SAVEDATA* sv,u32 param);
static void DNumInput_SafariObjLevelSet(SAVEDATA* sv,u32 param,u32 value);
static u32 DNumInput_SafariMapLevelGet(SAVEDATA* sv,u32 param);
static void DNumInput_SafariMapLevelSet(SAVEDATA* sv,u32 param,u32 value);
static u32 DNumInput_SafariGameParamGet(SAVEDATA* sv,u32 param);
static void DNumInput_SafariGameParamSet(SAVEDATA* sv,u32 param,u32 value);
static u32 DNumInput_GetFunNum(SAVEDATA* sv,u32 param);
static void DNumInput_SetFunNum(SAVEDATA* sv,u32 param,u32 value);
static u32 DNumInput_EventWorkGet(SAVEDATA *sv, u32 param);
static void DNumInput_EventWorkSet(SAVEDATA* sv, u32 param, u32 value);
static u32 DNumInput_TrainerIdGet(SAVEDATA* sv,u32 param);
static void DNumInput_TrainerIdSet(SAVEDATA* sv,u32 param,u32 value);
static u32 DNumInput_DebugFlagDataGet(SAVEDATA *sv, u32 param);
static void DNumInput_DebugFlagDataSet(SAVEDATA* sv, u32 param, u32 value);
static u32 DNumInput_PointGet(SAVEDATA *sv, u32 param);
static void DNumInput_PointSet(SAVEDATA* sv, u32 param, u32 value);

#include "fld_numinput.dat"

static const BMPWIN_DAT	DNInoutWindowData = {
	GF_BGL_FRAME3_M,
	DNI_LIST_PX1,DNI_LIST_PY1,
	DNI_LIST_SX,DNI_LIST_SY,DNI_LIST_PL,DNI_LIST_CH
};

//------------------------------------------------------------------
//	項目リストデータ
//------------------------------------------------------------------
static const BMPLIST_HEADER DNInputListHeader = {
	NULL,				//表示文字データポインタ
	NULL,				//カーソル移動ごとのコールバック関数
	ninput_call_back,		//１行ごとのコールバック関数
	NULL,				//GF_BGL_BMPWIN構造体データへのポインタ
	0,					//リスト項目数
	8,					//表示最大項目数
	2,					//ラベル表示Ｘ座標
	12,					//項目表示Ｘ座標
	1,					//カーソル表示Ｘ座標
	8,					//表示Ｙ座標
	FBMP_COL_WHITE,		//文字色
	FBMP_COL_BLACK,		//背景色
	FBMP_COL_BLK_SDW,	//文字影色
	0,					//文字間隔Ｘ
	0,					//文字間隔Ｙ
	BMPLIST_LRKEY_SKIP,	//ページスキップタイプ
	FONT_SYSTEM,			//文字指定
	0,					//ＢＧカーソル(allow)表示フラグ(0:ON,1:OFF)
	NULL,				//ワークポインタ
};

//------------------------------------------------------------------
//------------------------------------------------------------------
static const DEBUG_NUMINPUT_INITIALIZER initializer[D_NUMINPUT_MODE_MAX] = {
  { D_NINPUT_DATA_CONST,  0,
    Debug_NumInputL_Tower,
    Debug_NumInputG_Tower, NELEMS(Debug_NumInputG_Tower) },
  { D_NINPUT_DATA_CONST,  0,
    Debug_NumInputL_Tel,
    Debug_NumInputG_Tel, NELEMS(Debug_NumInputG_Tel) },
  { D_NINPUT_DATA_CONST,  0,
    Debug_NumInputL_SysFlag,
    Debug_NumInputG_SysFlag, NELEMS(Debug_NumInputG_SysFlag) },
  { D_NINPUT_DATA_CONST,  0,
    Debug_NumInputL_Record,
    Debug_NumInputG_Record, NELEMS(Debug_NumInputG_Record) },
  { D_NINPUT_DATA_CONST,  0,
    Debug_NumInputL_Safari,
    Debug_NumInputG_Safari, NELEMS(Debug_NumInputG_Safari) },
  { D_NINPUT_DATA_CONST,  0,
    Debug_NumInputL_Else,
    Debug_NumInputG_Else, NELEMS(Debug_NumInputG_Else) },
  { D_NINPUT_DATA_ALLOC,  NARC_scr_seq_debug_name_savework_bin,
    &protoList_savework,
    NULL, 0 },
  { D_NINPUT_DATA_ALLOC,  NARC_scr_seq_debug_name_evflag_bin,
    &protoList_evflag,
    NULL, 0 },
  { D_NINPUT_DATA_ALLOC,  NARC_scr_seq_debug_name_vanishflag_bin,
    &protoList_evflag,
    NULL, 0 },
  { D_NINPUT_DATA_ALLOC,  NARC_scr_seq_debug_name_itemflag_bin,
    &protoList_evflag,
    NULL, 0 },
  { D_NINPUT_DATA_ALLOC,  NARC_scr_seq_debug_name_elseflag_bin,
    &protoList_evflag,
    NULL, 0 },
  { D_NINPUT_DATA_ALLOC,  NARC_scr_seq_debug_name_sysflag_bin,
    &protoList_evflag,
    NULL, 0 },
  { D_NINPUT_DATA_ALLOC,  NARC_scr_seq_debug_name_syswork_bin,
    &protoList_syswork,
    NULL, 0 },
  { D_NINPUT_DATA_CONST,  0,  Debug_NumInputL_TrainerId, Debug_NumInputG_TrainerId, 2 },

};
//============================================================================================
//
//
//		フィールドデバッグメニュー 共通数値インプット処理
//
//
//============================================================================================
/**
 *	数値入力用の見出し文字列指定、paramは0からの連番
 *	Debug_NumInput_Listと並びをそろえておく必要あり！
 */
void FieldDebugNumInputList( FIELDSYS_WORK* fsys, D_NUMINPUT_MODE mode,int* end_f)
{
  GF_ASSERT(mode < NELEMS(initializer));
  DebugNumInputListStart(fsys, end_f, &initializer[mode]);
}

/**
 *	@brief	汎用デバッグ数値入力インターフェース
 */
static void DebugNumInputListStart(FIELDSYS_WORK * fsys,int* end_f,
    const DEBUG_NUMINPUT_INITIALIZER * init)
{
	u32 i,count;
	BMPLIST_HEADER bmplist_h;
	TCB_PTR	pTcb = NULL;
	DEBUG_NUMINPUT_WORK* wk;
	GMM_MENU_PARAM* list;
	WORDSET	*wset;
	MSGDATA_MANAGER* pMan;
	STRBUF*			tmp;

	wk = sys_AllocMemory(HEAPID_FIELD,sizeof(DEBUG_NUMINPUT_WORK));
	MI_CpuClear8(wk,sizeof(DEBUG_NUMINPUT_WORK));

	wk->pFdd = sys_AllocMemory(HEAPID_FIELD,sizeof(FLD_DEB_DAT));
	MI_CpuClear8(wk->pFdd,sizeof(FLD_DEB_DAT));

	wk->fsys = fsys;
	wk->pFdd->fsys = fsys;
	wk->p_end_f = end_f;
  wk->data_type = init->data_type;
  if (init->data_type == D_NINPUT_DATA_CONST) {
    wk->pList = init->pList;
    wk->list_num = init->list_count;
  } else {
    wk->pList = makeNumInputList(init->file_id, init->pList);
    wk->list_num = getNameFileCount(init->file_id);
  }

	//数字列描画用bmpウィンドウを追加
	GF_BGL_BmpWinAdd( fsys->bgl, &wk->win, FLD_MBGFRM_FONT, 16, 1, 12, 2,
		DNI_LIST_PL,DNI_LIST_CH+(DNI_LIST_SX*DNI_LIST_SY));
	GF_BGL_BmpWinDataFill(&wk->win,APP_WINCLR_COL(FBMP_COL_WHITE));
	GF_BGL_BmpWinOn(&wk->win);

	//文字セット追加
	wset = WORDSET_CreateEx(1,2,HEAPID_FIELD);
	pMan = MSGMAN_Create(MSGMAN_TYPE_NORMAL,ARC_MSG,
			NARC_msg_debug_numinput_dat,HEAPID_FIELD);
	tmp = MSGMAN_AllocString(pMan,dni_num_print);

	for(i = 0;i < 10;i++){
		wk->nbuf[i] = STRBUF_Create(2,HEAPID_FIELD);
		WORDSET_RegisterNumber(wset,0,i,1,
					NUMBER_DISPTYPE_ZERO,NUMBER_CODETYPE_DEFAULT);
		WORDSET_ExpandStr(wset,wk->nbuf[i],tmp);
	}
	STRBUF_Delete(tmp);
	MSGMAN_Delete(pMan);
	WORDSET_Delete(wset);

	//メイン処理タスク追加
	pTcb = TCB_Add(DebugNumInputControlTask,wk,0);

	//デバッグメニュー用変数初期化
  if (wk->data_type == D_NINPUT_DATA_CONST) {
    FieldDebugListInit(wk->pFdd,init->pMenu);
  }

	//デバッグメニュー用ウィンドウキャラクタ&パレットセット
	FieldBitMapWinCgxSet( fsys->bgl );

	//BITMAP追加
	wk->pFdd->pBmpwin = GF_BGL_BmpWinAllocGet(HEAPID_FIELD,1);
	GF_BGL_BmpWinAddEx(fsys->bgl,wk->pFdd->pBmpwin,&DNInoutWindowData);

	//BMPリスト設定
  if (wk->data_type == D_NINPUT_DATA_CONST) {
	  wk->pFdd->menulist = MakeFieldDebugMenu(NARC_msg_debug_numinput_dat,
		  	init->pMenu,wk->list_num);
  } else {
    wk->pFdd->menulist = makeMenuList( fsys, init->file_id );
  }

	bmplist_h = DNInputListHeader;
	bmplist_h.list = wk->pFdd->menulist;
	bmplist_h.win = wk->pFdd->pBmpwin;
	bmplist_h.count = wk->list_num;//NELEMS(Debug_NumInput_Gmm);
	wk->pFdd->blistWk = BmpListSet(&(bmplist_h),wk->pFdd->DebugList,wk->pFdd->DebugCursor,HEAPID_FIELD);

	wk->pFdd->finish_func = FieldDebugListSet;

	//イベントフック
	FieldSystemProc_SeqHold();
}

#define FCOLS_BLACK	(GF_PRINTCOLOR_MAKE(FBMP_COL_BLACK,FBMP_COL_BLK_SDW,FBMP_COL_NULL))
#define FCOLS_GREEN	(GF_PRINTCOLOR_MAKE(FBMP_COL_GREEN,FBMP_COL_GRN_SDW,FBMP_COL_WHITE))

static void ninput_print(DEBUG_NUMINPUT_WORK* wk)
{
	u32 i,val,tmp,ofs,now;

	tmp = 1;
	val = 0;
	ofs = 12*8;
	GF_BGL_BmpWinDataFill(&wk->win,APP_WINCLR_COL(FBMP_COL_WHITE));

	now = wk->value;
	for(i = 0;i < (wk->n_keta-1);i++){
		tmp *= 10;
	}
	for(i = wk->n_keta;i > 0;i--){
		val = now/tmp;
		if(val != 0){
			now -= val*tmp;
		}
		if((i-1) == wk->sel){
			GF_STR_PrintColor(&wk->win,FONT_SYSTEM,
				wk->nbuf[val],ofs-9*i,0,MSG_NO_PUT,FCOLS_GREEN,NULL);
		}else{
			GF_STR_PrintColor(&wk->win,FONT_SYSTEM,
				wk->nbuf[val],ofs-9*i,0,MSG_NO_PUT,FCOLS_BLACK,NULL);
		}
		tmp /= 10;
	}
	GF_BGL_BmpWinOn(&wk->win);
}

static int ninput_updown(DEBUG_NUMINPUT_WORK* wk,int mode)
{
	static const u32 ninput_incdec[] = {
	1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000
	};
	if(mode == 0){	//add
		if((wk->value+ninput_incdec[wk->sel] > wk->n_max)||
			(s64)(wk->value)+ninput_incdec[wk->sel]>0xFFFFFFFF){
			wk->value = wk->n_min;
		}else{
			wk->value += ninput_incdec[wk->sel];
		}
	}else{
		if((s64)(wk->value)-ninput_incdec[wk->sel] < wk->n_min){
			wk->value = wk->n_max;
		}else{
			wk->value -= ninput_incdec[wk->sel];
		}
	}
	return 1;
}
static int ninput_side(DEBUG_NUMINPUT_WORK* wk,int mode)
{
	if(mode == 0){	//left
		if(wk->sel < wk->n_keta){
			wk->sel++;
			return 1;
		}
	}else{
		if(wk->sel > 0){
			wk->sel--;
			return 1;
		}
	}
	return 0;
}

/**
 *	@brief	数値入力コントロール
 */
static void DebugNumInputControlTask(TCB_PTR tcb,void* work)
{
	u32 i,value,flag;
	s32	ret_code;
	DEBUG_NUMINPUT_WORK* wk = (DEBUG_NUMINPUT_WORK*)work;

	switch(wk->seq){
	case 0:
		ret_code = BmpListMain(wk->pFdd->blistWk);

		if(sys.trg & PAD_BUTTON_CANCEL){
			FieldDebugExitCall(tcb,wk->pFdd);
			FieldDebugListSet(wk->fsys);
			GF_BGL_BmpWinOff(&wk->win);
			GF_BGL_BmpWinDel(&wk->win);
			for(i = 0;i < 10;i++){
				STRBUF_Delete(wk->nbuf[i]);
			}
			(*wk->p_end_f) = TRUE;
      if (wk->data_type == D_NINPUT_DATA_ALLOC) {
        sys_FreeMemoryEz((void *)wk->pList);
      }
			sys_FreeMemoryEz(work);
			return;
		}
		if(!(sys.trg & PAD_BUTTON_DECIDE)){
			return;
		}
		wk->sel = 0;
		wk->now = ret_code;
		wk->n_min = wk->pList[wk->now].min;
		wk->n_max = wk->pList[wk->now].max;

		if((wk->pList[wk->now].get_func)!=NULL){
			if(wk->pList[wk->now].func_type == D_NINPUT_F_FSYS){
				wk->value =
					((DEBUG_NUMGET_FUNC_F)(wk->pList[wk->now].get_func))(
						wk->fsys,wk->pList[wk->now].param);
			}else{
				wk->value =
					((DEBUG_NUMGET_FUNC_S)(wk->pList[wk->now].get_func))(
						wk->fsys->savedata,wk->pList[wk->now].param);
			}
		}else{
			wk->value = wk->n_min;
		}

		//4294967295
		if(wk->n_max>=1000000000){
			wk->n_keta = 10;
		}else{
			value = 10;
			for(i = 1;i < 10;i++){
				if((wk->n_max/value)==0){
					wk->n_keta = i;
					break;
				}
				value *= 10;
			}
		}
		ninput_print(wk);
		wk->seq++;
		break;
	case 1:	//数値入力
		if(sys.trg & PAD_BUTTON_CANCEL){
			wk->seq++;
			return;
		}else if(sys.trg & PAD_BUTTON_DECIDE){
			//数値適用
			if(wk->pList[wk->now].func_type == D_NINPUT_F_FSYS){
				((DEBUG_NUMINPUT_FUNC_F)(wk->pList[wk->now].set_func))(
					wk->fsys,wk->pList[wk->now].param,wk->value);
			}else{
				((DEBUG_NUMINPUT_FUNC_S)(wk->pList[wk->now].set_func))(
					wk->fsys->savedata,wk->pList[wk->now].param,wk->value);
			}
			wk->seq++;
			return;
		}
		flag = 0;
		if(sys.trg & PAD_KEY_DOWN){
			flag = ninput_updown(wk,1);
		}else if(sys.trg & PAD_KEY_UP){
			flag = ninput_updown(wk,0);
		}else if(sys.trg & PAD_KEY_LEFT){
			flag = ninput_side(wk,0);
		}else if(sys.trg & PAD_KEY_RIGHT){
			flag = ninput_side(wk,1);
		}
		//描画更新
		if(flag){
			ninput_print(wk);
		}
		break;
	case 2:
		GF_BGL_BmpWinDataFill(&wk->win,APP_WINCLR_COL(FBMP_COL_WHITE));
		GF_BGL_BmpWinOn(&wk->win);
		wk->seq = 0;
		break;
	}
}

//------------------------------------------------------------------
//	リストシステムからのコールバック※一行表示ごと
//------------------------------------------------------------------
static void	ninput_call_back(BMPLIST_WORK* lw,u32 param,u8 y)
{
	if(param == BMPLIST_RABEL){
		BmpListTmpColorChange(lw,FBMP_COL_RED_SDW,FBMP_COL_BLACK,FBMP_COL_RED);
	}else{
		BmpListTmpColorChange(lw,FBMP_COL_WHITE,FBMP_COL_BLACK,FBMP_COL_BLK_SDW);
	}
}

//レコード記録の現在値を取得する関数
static u32 DNumInput_RecordGet(SAVEDATA* sv,u32 param)
{
	return RECORD_Get(SaveData_GetRecord(sv),param);
}
//レコード記録に値をセットする関数
static void DNumInput_RecordSet(SAVEDATA* sv,u32 param,u32 value)
{
	RECORD_Set(SaveData_GetRecord(sv),param,value);
}
//フロンティアレコード記録の現在値を取得する関数
static u32 DNumInput_FrRecordGet(SAVEDATA* sv,u32 param)
{
	return FrontierRecord_Get(SaveData_GetFrontier(sv),param,FRONTIER_RECORD_NOT_FRIEND);
}
//フロンティアレコード記録に値をセットする関数
static void DNumInput_FrRecordSet(SAVEDATA* sv,u32 param,u32 value)
{
	FrontierRecord_Set(SaveData_GetFrontier(sv),param,FRONTIER_RECORD_NOT_FRIEND,value);
}
//タワーの周回数をゲットする関数
static u32 DNumInput_TowerStageGet(SAVEDATA* sv,u32 param)
{
	BTLTOWER_SCOREWORK* score = SaveData_GetTowerScoreData(sv);
	return TowerScoreData_SetStage(score,param,BTWR_DATA_get);
}
//タワーの周回数をセットする関数
static void DNumInput_TowerStageSet(SAVEDATA* sv,u32 param,u32 value)
{
	BTLTOWER_SCOREWORK* score = SaveData_GetTowerScoreData(sv);
	TowerScoreData_DebugSetStageValue(score,param,value);
}
//タワーに挑戦中のフラグをON/Offする
static u32 DNumInput_TowerChallengeGet(SAVEDATA* sv,u32 param)
{
	BTLTOWER_SCOREWORK* score = SaveData_GetTowerScoreData(sv);
	return TowerScoreData_SetFlags(score,param,BTWR_DATA_get);
}
//タワーに挑戦中のフラグをON/Offする
static void DNumInput_TowerChallengeSet(SAVEDATA* sv,u32 param,u32 value)
{
	BTLTOWER_SCOREWORK* score = SaveData_GetTowerScoreData(sv);
	if(value){
		TowerScoreData_SetFlags(score,param,BTWR_DATA_set);
	}else{
		TowerScoreData_SetFlags(score,param,BTWR_DATA_reset);
	}
}
//タワーwifiランクを取得
static u32 DNumInput_TowerWifiRankGet(SAVEDATA* sv,u32 param)
{
	BTLTOWER_SCOREWORK* score = SaveData_GetTowerScoreData(sv);
	return TowerScoreData_SetWifiRank(score,BTWR_DATA_get);
}
//タワーwifiランクをセット
static void DNumInput_TowerWifiRankSet(SAVEDATA* sv,u32 param,u32 value)
{
	u32 i;
	BTLTOWER_SCOREWORK* score = SaveData_GetTowerScoreData(sv);

	TowerScoreData_SetWifiRank(score,BTWR_DATA_reset);

	for(i = 0;i < value-1;i++){
		TowerScoreData_SetWifiRank(score,BTWR_DATA_inc);
	}
}
//ぼんぐりセーブデータを取得する関数
static u32 DNumInput_BonguriGet(SAVEDATA* sv,u32 param)
{
	BONGURI_SAVE* bong = SaveData_GetBonguriSave(sv);

	if(param < 7){
		return BonguriSave_GetBonguriNum(bong,param);
	}else if(param < 12){
		return BonguriSave_GetFlavorLevel(bong,param-7);
	}
	switch(param){
	case 12:
		return BonguriSave_GetMildLevel(bong);
	case 13:
		return BonguriSave_GetJuiceRestCount(bong);
	}
	return 0;
}
//ぼんぐりセーブデータをセットする関数
static void DNumInput_BonguriSet(SAVEDATA* sv,u32 param,u32 value)
{
	BONGURI_SAVE* bong = SaveData_GetBonguriSave(sv);

	if(param < 7){
		BonguriSave_SetBonguriNum(bong,param,value);
	}else if(param < 12){
		BonguriSave_SetFlavorLevel(bong,param-7,value);
	}
	switch(param){
	case 12:
		BonguriSave_SetMildLevel(bong,value);
		break;
	case 13:
		BonguriSave_SetJuiceRestCount(bong,value);
		break;
	}
}
//プレイ時間を取得する関数
static u32 DNumInput_PlayTimeGet(SAVEDATA* sv,u32 param)
{
	PLAYTIME * ptime = SaveData_GetPlayTime(sv);

	if(param == 0){
		return PLAYTIME_GetHour(ptime);
	}else{
		return PLAYTIME_GetMinute(ptime);
	}
}
//プレイ時間をセットする関数
static void DNumInput_PlayTimeSet(SAVEDATA* sv,u32 param,u32 value)
{
	PLAYTIME * ptime = SaveData_GetPlayTime(sv);
	u16 hour = PLAYTIME_GetHour(ptime);
	u16 min = PLAYTIME_GetMinute(ptime);

	if(param == 0){
		if(value > 999){
			value = 999;
		}
		PLAYTIME_Set(ptime, value, min, 0);
	}else{
		if(value > 59){
			value = 59;
		}
		PLAYTIME_Set(ptime, hour, value, 0);
	}
}

//サファリのOBJレベルをゲットする関数
static u32 DNumInput_SafariObjLevelGet(SAVEDATA* sv,u32 param)
{
	SAFARI_SAVE* safari_sv = SaveData_GetSafariSave(sv);
	return SafariSv_GetObjLevel(safari_sv);
}
//サファリのOBJレベルをセットする関数
static void DNumInput_SafariObjLevelSet(SAVEDATA* sv,u32 param,u32 value)
{
	SAFARI_SAVE* safari_sv = SaveData_GetSafariSave(sv);
	SafariSv_ObjLevelSet(safari_sv,value);
}
//サファリのマップ経験値をゲットする関数
static u32 DNumInput_SafariMapLevelGet(SAVEDATA* sv,u32 param)
{
	SAFARI_LAYOUT* pl = SafariSv_GetLayoutPointer(SaveData_GetSafariSave(sv),param/12);
	return pl->map_level[param%12];
}

//サファリのマップ経験値をセットする関数
static void DNumInput_SafariMapLevelSet(SAVEDATA* sv,u32 param,u32 value)
{
	SAFARI_LAYOUT* pl = SafariSv_GetLayoutPointer(SaveData_GetSafariSave(sv),param/12);
	pl->map_level[param%12] = value;
}
//サファリゲームの残りボール数/歩数をゲットする関数
static u32 DNumInput_SafariGameParamGet(SAVEDATA* sv,u32 param)
{
	u16* value;
    SITUATION * st = SaveData_GetSituation(sv);

	switch(param){
	case 0:	//ボール
		value = Situation_GetSafariBallCount(st);
		break;
	case 1:	//歩数
		value = Situation_GetSafariStepCount(st);
		break;
	default:
		return 0;
	}
	return (*value);
}
//サファリゲームの残りボール数/歩数をセットする関数
static void DNumInput_SafariGameParamSet(SAVEDATA* sv,u32 param,u32 value)
{
    SITUATION * st = SaveData_GetSituation(sv);
	u16* pv;
	switch(param){
	case 0:	//ボール
		pv = Situation_GetSafariBallCount(st);
		break;
	case 1:	//歩数
		pv = Situation_GetSafariStepCount(st);
		break;
	default:
		return;
	}
	*pv = (u16)value;
}

//ファンの数ゲット関数
static u32 DNumInput_GetFunNum(SAVEDATA* sv,u32 param)
{
	PKTH_RNK_DATA * rank = PkthlnSv_GetRnkData( PkthlnSv_GetSaveData(sv) );
	return rank->FunNum;
}

//ファンの数セット関数
static void DNumInput_SetFunNum(SAVEDATA* sv,u32 param,u32 value)
{
	PKTH_RNK_DATA * rank = PkthlnSv_GetRnkData( PkthlnSv_GetSaveData(sv) );
	rank->FunNum = value;
}

//各種ポイントゲット関数
static u32 DNumInput_PointGet(SAVEDATA* sv,u32 param)
{
	switch(param){
	case 0:	//おこづかい
		return MyStatus_GetGold(SaveData_GetMyStatus(sv));
	case 1:	//コイン
		return COIN_GetValue(SaveData_GetMyCoin(sv));
	case 2:	//BP
		return TowerScoreData_SetBattlePoint(
			SaveData_GetTowerScoreData(sv),0,BTWR_DATA_get);
	case 3:	//TP
		break;
	}
	return 0;
}

//各種ポイントセット関数
static void DNumInput_PointSet(SAVEDATA* sv,u32 param,u32 value)
{
	switch(param){
	case 0:	//おこづかい
		MyStatus_SetGold(SaveData_GetMyStatus(sv),value);
		break;
	case 1:	//コイン
		COIN_Set(SaveData_GetMyCoin(sv),value);
		break;
	case 2:	//BP
		TowerScoreData_SetBattlePoint(
			SaveData_GetTowerScoreData(sv),value,BTWR_DATA_add);
		break;
	case 3:	//TP
		break;
	}
}


// ----------------------------------------------------------------------------
// localize_spec_mark(LANG_ALL) imatake 2007/10/30
// 主人公のトレーナーIDを変更するデバッグ機能を追加
//トレーナーIDを取得
static u32 DNumInput_TrainerIdGet(SAVEDATA* sv,u32 param)
{
	MYSTATUS* mystatus = SaveData_GetMyStatus(sv);
	u32 id = MyStatus_GetID_Low(mystatus);

	switch (param) {
		case TRAINERID_FULL:
			return id;
		case TRAINERID_UPPER4BITS:
			return id & 0xF;
	}

	return 0;
}
//トレーナーIDをセット
static void DNumInput_TrainerIdSet(SAVEDATA* sv,u32 param,u32 value)
{
	MYSTATUS* mystatus = SaveData_GetMyStatus(sv);
	u32 id = MyStatus_GetID(mystatus);

	switch (param) {
		case TRAINERID_FULL:
			id &= ~0x0000FFFF;
			id |= value;
			break;
		case TRAINERID_UPPER4BITS:
			id &= ~0x0000000F;
			id |= value;
			break;
	}

	MyStatus_SetID(mystatus, id);
}

//  DEBUG_FLAG_DATAパラメータゲット
static u32 DNumInput_DebugFlagDataGet(SAVEDATA *sv, u32 param)
{
	switch(param){
	case 0:
		return DebugFlagData.msg_fast_print_f;
	case 1:
		return DebugFlagData.encount_flag;
	}
	return 0;
}

//  DEBUG_FLAG_DATAの値セット関数
static void DNumInput_DebugFlagDataSet(SAVEDATA* sv, u32 param, u32 value)
{
	switch(param){
	case 0:
		DebugFlagData.msg_fast_print_f = value;
		break;
	case 1:
		DebugFlagData.encount_flag = value;
		break;
	}
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//  セーブワークの値ゲット関数
static u32 DNumInput_EventWorkGet(SAVEDATA *sv, u32 param)
{
  EVENTWORK* ev = SaveData_GetEventWork(sv);
  return *EventWork_GetEventWorkAdrs(ev, param);
}

//  セーブワークの値セット関数
static void DNumInput_EventWorkSet(SAVEDATA* sv, u32 param, u32 value)
{
  EVENTWORK* ev = SaveData_GetEventWork(sv);
  u16 * adrs = EventWork_GetEventWorkAdrs(ev, param);
  *adrs = value;
}
//============================================================================================
//
//    セーブワーク一覧表示用追加処理
//
//============================================================================================
enum {
  NAMEFILE_ARCID = ARC_SCRIPT,
  NAMEFILE_DATASIZE = 2 + 36,
};
//-----------------------------------------------------------------------------
/**
 * @brief セーブワークの項目数を取得する関数
 */
//-----------------------------------------------------------------------------
static u32 getNameFileCount(u32 file_id)
{
  //ファイルサイズを各項目当たりのデータサイズで割って取得
  u32 size = ArchiveDataSizeGet(NAMEFILE_ARCID, file_id);
  return size / NAMEFILE_DATASIZE;
}
//-----------------------------------------------------------------------------
/**
 * @brief 各項目ごとのセーブワークアクセス用データ生成
 */
//-----------------------------------------------------------------------------
static const DEBUG_NUMINPUT_LIST * makeNumInputList(u32 file_id, const DEBUG_NUMINPUT_LIST * proto)
{
  u32 count;
  u32 max = getNameFileCount(file_id);
  u8 * data = ArchiveDataLoadMallocLo(NAMEFILE_ARCID, file_id, HEAPID_FIELD);
  DEBUG_NUMINPUT_LIST * list = sys_AllocMemory(HEAPID_FIELD, sizeof(DEBUG_NUMINPUT_LIST) * max);

  for (count = 0; count < max; count++) {
    list[count] = *proto;
    list[count].param = *(u16 *)(&data[NAMEFILE_DATASIZE * count]);
  }
  sys_FreeMemoryEz(data);
  return list;

}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
static void addMenuItem(BMP_MENULIST_DATA * menulist, STRBUF * mstr, u8 * name, u32 id)
{
  STRCODE tmpbuf[128];
  PM_strclear(tmpbuf, EOM_, 128);
  STRBUF_Clear(mstr);
  if(ASCIIcode2DSuni(0, name, tmpbuf)) {
    tmpbuf[0] = EOM_;
  }
	STRBUF_SetStringCode(mstr,tmpbuf);
	BMP_MENULIST_AddString(menulist,mstr,id);
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
static BMP_MENULIST_DATA * makeMenuList(FIELDSYS_WORK * fsys, u32 file_id)
{
  u32 max = getNameFileCount(file_id);
	BMP_MENULIST_DATA * menulist = BMP_MENULIST_Create(max,HEAPID_FIELD);
	STRBUF	*mstr = STRBUF_Create(128,HEAPID_BASE_DEBUG);
  u8 * data = ArchiveDataLoadMallocLo(NAMEFILE_ARCID, file_id, HEAPID_FIELD);
  u8 * buffer = sys_AllocMemory(HEAPID_FIELD, NAMEFILE_DATASIZE);

  {
    int i, j;
    u8 * reader = data;

    for (i = 0; i<max; i++, reader += NAMEFILE_DATASIZE) {
      u16 value = *((u16*)reader);  //各項目の先頭２バイトはワークIDの指定

      for (j = 0; j < NAMEFILE_DATASIZE - 2; j++) {
        if (reader[2+j] == ' '){
          buffer[j] = '\0';
        } else {
          buffer[j] = reader[2+j];
        }
      }
      //OS_Printf("%0xd %s\n", value, buffer);
      addMenuItem(menulist, mstr, buffer, i);
    }
  }
  sys_FreeMemoryEz(data);
  sys_FreeMemoryEz(buffer);
	STRBUF_Delete(mstr);
  return menulist;
}

#endif	//PM_DEBUG
